package com.bitoon.basketdudes.web;

import com.bitoon.basketdudes.web.jpa.*;
import com.bitoon.basketdudes.web.datos.*;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import java.util.*;
import javax.persistence.*;

public class DetalleEquipo extends BaseListadoResultados {

    private String urlEquipo;
    private Equipo equipoMostrar;
    private EstadisticaEquipo estadisticaEquipo;
    private EstEquipo estEquipo;
    private String valor;
    private List<Jugador> jugadoresHistoricos;
    private List<Partido> datos;

    private List<Palmares> palmaresWeekly;
    private List<Palmares> palmaresTorneo;

    private Logger log = Logger.getLogger(DetalleEquipo.class);

    private String[] posiciones_cn = {"", "Point Guard", "Shooting Guard", "Small Forward", "Power Forward", "Center"};

    @Override
    public String execute() {

        String retorno = SUCCESS;

        EntityManager em = null;
        Equipo equipo = null;

        try {
            em = emfBasket.createEntityManager(); // checked

            urlEquipo = urlEquipo.replace("_","&");

            equipo = buscarEquipo(this.urlEquipo, em);

            if (equipo == null) {
                retorno = NOT_FOUND;
            } else {
                setEquipoMostrar(equipo);
                setEstEquipo(buscarEstEquipo(equipo.getId(), em));

                setPalmaresWeekly(em);
                setPalmaresTorneo(em);

                EstadisticaEquipo estadistica = new EstadisticaEquipo();
                estadistica.calculaMedia(equipo.getPlantilla());
                setEstadisticaEquipo(estadistica);

            }
        } catch (Exception e) {
            log.error("Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }
    
    public String resultados() {
        String retorno = SUCCESS;

        EntityManager em = null;
        Equipo equipo = null;

        try {
            em = emfBasket.createEntityManager(); // checked

            urlEquipo = urlEquipo.replace("_","&");

            equipo = buscarEquipo(this.urlEquipo, em);

            if (equipo == null) {
                retorno = NOT_FOUND;
            } else {
                setEquipoMostrar(equipo);
                // fijar datos con los resultados de la query
                setDatos(getPartidosPasadosIdEquipoLimit(equipo.getId()));
            }
        } catch (Exception e) {
            log.error("Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }
    

    public String xhr() {
        //esto devuelve los resultados para paginar con ajax
        EntityManager em = null;
        Equipo equipo = null;

        try {
            em = emfBasket.createEntityManager(); // checked
            
            urlEquipo = urlEquipo.replace("_","&");

            equipo = buscarEquipo(this.urlEquipo, em);

            //asigno el equipo que hace la consulta
            setEquipoMostrar(equipo);

            log.debug("Entro xhr");

            // fijar datos con los resultados de la query
            setDatos(getPartidosPasadosIdEquipoLimit(equipo.getId()));

        } catch (Exception e) {
            log.error("Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }
        return SUCCESS;
    }

    public String getUrlEquipo() {
        return urlEquipo;
    }

    public void setUrlEquipo(String nombre) {
        this.urlEquipo = nombre;
    }

    private void setPalmaresWeekly(EntityManager em) {
        try {
            Query q = em.createNamedQuery("Palmares.findWeeklyByEquipoId");
            q.setParameter("idEquipo", equipoMostrar.getId());

            setPalmaresWeekly((List<Palmares>)q.getResultList());
        } catch (Exception e) {
            log.error("Error: ", e);
        }
    }

    private void setPalmaresTorneo(EntityManager em) {
        try {
            Query q = em.createNamedQuery("Palmares.findTorneoByEquipoId");
            q.setParameter("idEquipo", equipoMostrar.getId());

            setPalmaresTorneo((List<Palmares>)q.getResultList());
        } catch (Exception e) {
            log.error("Error: ", e);
        }
    }

    private Equipo buscarEquipo(String nombreUrl, EntityManager em) {
        Equipo equipo = null;

        try {

            Query q;
            if (configuracionGeneral.get("links.type").equals("nick")) {
                q  = em.createNamedQuery("Equipo.findByNombreUrl");
                q.setParameter("nombre", nombreUrl);
            } else {
                // Por defecto, id
                q = em.createNamedQuery("Equipo.findById");
                q.setParameter("idEquipo", Integer.parseInt(nombreUrl));
            }

            equipo = (Equipo)q.getSingleResult();

            // Buscar plantilla ordenada y asignarla al equipo

            /*
            q = em.createNamedQuery("Plantilla.findByEquipoId");
            q.setParameter("equipoId", equipo.getId());
            List<Plantilla> plantilla = q.getResultList();

            equipo.setPlantilla(plantilla);
             * 
             */

        } catch (NoResultException nre) {
            log.debug("[buscarEquipo] El equipo " + nombreUrl + " no existe");
        } catch (Exception e) {
            log.error("[buscarEquipo]: ", e);
        } 

        return equipo;
    }

    private EstEquipo buscarEstEquipo(int equipoId, EntityManager em) {
        EstEquipo estEquip = null;

        try {
            Query q = em.createNamedQuery("EstEquipo.findByEquipoId");
            q.setParameter("equipoId", equipoId);

            estEquip = (EstEquipo)q.getSingleResult();

            log.debug("estEquipo: " + estEquip);
        } catch (Exception e) {
            log.error("[getEquipo]: " + e);
        }

        return estEquip;
    }

    private EstEquipo dameEstEquipo(int idEquipo, EntityManager em) {
        EstEquipo estEquip = null;

        try {

            Query q = em.createNamedQuery("EstEquipo.findByEquipoId");
            q.setParameter("equipoId", idEquipo);

            estEquip = (EstEquipo)q.getSingleResult();

        } catch (Exception e) {
            log.error("[dameEstEquipo]: " + e);
        } 

        return estEquip;
    }

    public List<Equipo> getEquiposUsuario(EntityManager em) {
        List<Equipo> lista = null;

        try {

            ValueStack valueStack = ActionContext.getContext().getValueStack();
            Usuario u = (Usuario)valueStack.findValue("stackUserLogado");

            Query q = em.createNamedQuery("Equipo.findByIdUsuario");
            q.setParameter("idUsuario", u.getId());

            lista = (List<Equipo>)q.getResultList();

        } catch (Exception e) {
            log.error("[getEquiposUsuario]: " + e);
        } 

        return lista;
    }

public String mostrarInfoEquipo(int id){
        EntityManager em = null;
        Equipo equipo = null;
        String retorno = SUCCESS;

        try {
            em = emfBasket.createEntityManager(); // checked

            Query q  = em.createNamedQuery("Equipo.findById");
            q.setParameter("idEquipo", id);

            equipo = (Equipo)q.getSingleResult();

            if (equipo != null) {
                setEquipoMostrar(equipo);
                setEstEquipo(buscarEstEquipo(equipo.getId(), em));

                EstadisticaEquipo estadistica = new EstadisticaEquipo();
                estadistica.calculaMedia(equipo.getPlantilla());
                setEstadisticaEquipo(estadistica);
            }
        } catch (Exception e) {
            log.error("Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public Equipo getEquipoMostrar() {
        return equipoMostrar;
    }

    public void setEquipoMostrar(Equipo equipoMostrar) {
        this.equipoMostrar = equipoMostrar;
    }

    public EstadisticaEquipo getEstadisticaEquipo() {
        return estadisticaEquipo;
    }

    public void setEstadisticaEquipo(EstadisticaEquipo estadisticaEquipo) {
        this.estadisticaEquipo = estadisticaEquipo;
    }

    public EstEquipo getEstEquipo() {
        return estEquipo;
    }

    public void setEstEquipo(EstEquipo estEquipo) {
        this.estEquipo = estEquipo;
    }

    public String[] getPosiciones() {
        String[] retorno = posiciones_cn;
        return retorno;
    }

    public String getValor() {
        return valor;
    }

    public void setValor(String valor) {
        this.valor = valor;
    }

    public List<Jugador> getJugadoresHistoricos() {
        return jugadoresHistoricos;
    }

    public void setJugadoresHistoricos(List<Jugador> jugadoresHistoricos) {
        this.jugadoresHistoricos = jugadoresHistoricos;
    }

    public List<Partido> getDatos() {
        return datos;
    }

    public void setDatos(List<Partido> datos) {
        this.datos = datos;
    }

    public List<Palmares> getPalmaresWeekly() {
        return palmaresWeekly;
    }

    public void setPalmaresWeekly(List<Palmares> palmaresWeekly) {
        this.setPalmaresWeekly(palmaresWeekly);
    }

    public List<Palmares> getPalmaresTorneo() {
        return palmaresTorneo;
    }

    public void setPalmaresTorneo(List<Palmares> palmaresTorneo) {
        this.setPalmaresTorneo(palmaresTorneo);
    }
}
